#include<bits/stdc++.h>
using namespace std;
typedef tuple<int,int,int> tpi;
int main(){
  freopen("bird.in","r",stdin);
  freopen("bird.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n; cin>>n;
  vector<vector<int> > g(n),g2(n);
  for(int i=1;i<n;i++){
    int u,v; cin>>u>>v;
    g[--u].emplace_back(--v);
    g[v].emplace_back(u);
  }
  vector<int> b(n),f(n);
  vector<multiset<tpi,greater<tpi> > > s(n);
  function<void(int,int)> dfs=[&](int u,int p){
    int mx=0,h=-1,c=0;
    for(int i:g[u])
      if(i!=p){
        dfs(i,u),c++;
        if(s[i].size()>mx)mx=s[i].size(),h=i;
      }
    if(h<0)s[u].emplace(f[u]=1,0,u);
    else{
      s[u].swap(s[h]);
      for(int i:g[u])
        if(i!=p&&i!=h)
          for(auto j:s[i])s[u].emplace(j);
      if(s[u].size()==1){
        f[u]=get<0>(*s[u].begin())+1;
        int ux=get<2>(*s[u].begin());
        s[u].erase(s[u].begin());
        s[u].emplace(f[u]-1,1,ux);
        s[u].emplace(1,0,u);
      }
      else{
        f[u]=get<0>(*s[u].begin())+1;
        int ux=get<2>(*s[u].begin());
        g2[u].emplace_back(ux);
        s[u].erase(s[u].begin());
        f[u]+=get<0>(*s[u].begin());
        ux=get<2>(*s[u].begin());
        g2[u].emplace_back(ux);
        s[u].erase(s[u].begin());
        s[u].emplace(f[u],0,u);
      }
    }
  };
  dfs(0,0);
  function<void(int,int)> dfs1=[&](int u,int p){
    b[u]=true;
    for(int i:g2[u])
      if(i!=p)dfs1(i,u);
  };
  dfs1(0,0);
  function<bool(int,int,bool)> dfs2=[&](int u,int p,bool h){
    if(!b[u])h=true;
    else if(h)return true;
    for(int i:g[u])
      if(i!=p&&dfs2(i,u,h))return true;
    return false;
  };
  cout<<f[0]+dfs2(0,0,false)<<endl;
  return 0;
}